package com.dp.client.views;

import java.util.List;

import com.dp.client.dto.CiudadDTO;
import com.dp.client.dto.ContinenteDTO;
import com.dp.client.dto.PaisDTO;
import com.dp.client.servicios.almacenes.IServiciosAlmacen;
import com.dp.client.servicios.almacenes.IServiciosAlmacenAsync;
import com.dp.client.servicios.geograficos.IServiciosGeograficos;
import com.dp.client.servicios.geograficos.IServiciosGeograficosAsync;
import com.dp.client.util.Alerts;
import com.dp.client.views.paquete.DestinoPaquete;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.i18n.client.HasDirection.Direction;

public class Geografico extends Composite {
	private Grid grid;
	private ListBox cbxPais;
	private ListBox cbxCiudad;
	private ListBox cbxContinente;
	private Label lblContinente;
	private Label lblPais;
	private Label lblCiudad;
	private int idAlmacen;
	private int seleccionCiudad;
	private int seleccionPais;
	private int seleccionContinente;
	
	private DestinoPaquete destinoPaquete=null;
	
	public Geografico(int idAlmacen) {
		
		grid = new Grid(3, 2);
		this.idAlmacen=0;
		
		initWidget(grid);
		grid.setSize("169px", "120px");
		
		lblContinente = new Label("Continente :");
		grid.setWidget(0, 0, lblContinente);
		
		cbxContinente = new ListBox();
		cbxContinente.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				seleccionPais=0;
				seleccionCiudad=0;
				seleccionContinente=Integer.parseInt(cbxContinente.getValue(cbxContinente.getSelectedIndex()));
				llenarComboPaises(cbxContinente.getValue(cbxContinente.getSelectedIndex()));
			}
		});
		grid.setWidget(0, 1, cbxContinente);
		
		lblPais = new Label("Pais :");
		grid.setWidget(1, 0, lblPais);
		cbxPais = new ListBox();
		cbxPais.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				seleccionCiudad=0;
				seleccionPais=Integer.parseInt(cbxPais.getValue(cbxPais.getSelectedIndex()));
				llenarComboCiudades(cbxPais.getValue(cbxPais.getSelectedIndex()));
			}
		});
		grid.setWidget(1, 1, cbxPais);
		
		lblCiudad = new Label("Ciudad:");
		grid.setWidget(2, 0, lblCiudad);
		
		cbxCiudad = new ListBox();
		cbxCiudad.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if (destinoPaquete != null)
					seleccionCiudad=Integer.parseInt( cbxCiudad.getValue(cbxCiudad.getSelectedIndex() ));
					if (Integer.parseInt( cbxCiudad.getValue(cbxCiudad.getSelectedIndex() ))<1)
						destinoPaquete.ocultarInfoAlmacen();
					else destinoPaquete.llenarAlmacen();
			}
		});
		grid.setWidget(2, 1, cbxCiudad);
		
		llenarComboContinente();
	}
	public void llenarComboContinente() {
		if (destinoPaquete != null){
			destinoPaquete.ocultarInfoAlmacen();
		}
		IServiciosGeograficosAsync serviciosPais = GWT.create(IServiciosGeograficos.class);
		serviciosPais.listContinentes(idAlmacen, new AsyncCallback<List<ContinenteDTO>>(){
			@Override
			public void onSuccess(List<ContinenteDTO> result) {
				cbxContinente.clear();
				cbxPais.clear();
				cbxCiudad.clear();
				cbxPais.addItem("Seleccione",null,0+"");
				cbxCiudad.addItem("Seleccione",null,0+"");
				cbxContinente.addItem("Seleccione",null,0+"");
				for(ContinenteDTO c: result){
					cbxContinente.addItem(c.getNombre(),null,c.getId()+"");
				}
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
		
	}
	public CiudadDTO getCiudad(){
		ContinenteDTO continente=new ContinenteDTO();
		continente.setId(Integer.parseInt(cbxContinente.getValue(cbxContinente.getSelectedIndex())));
		continente.setNombre(cbxContinente.getItemText(cbxContinente.getSelectedIndex()));
		
		PaisDTO pais=new PaisDTO();
		pais.setId(Integer.parseInt( cbxPais.getValue(cbxPais.getSelectedIndex() )));
		pais.setNombre(cbxPais.getItemText( cbxPais.getSelectedIndex() ));
		pais.setContinente(continente);
		
		CiudadDTO ciudad=new CiudadDTO();
		ciudad.setId(Integer.parseInt( cbxCiudad.getValue( cbxCiudad.getSelectedIndex() ) ));
		ciudad.setNombre( cbxCiudad.getItemText( cbxCiudad.getSelectedIndex() ) );
		return ciudad;
	}
	public int getIdPais(){
		//return Integer.parseInt( cbxPais.getValue(cbxPais.getSelectedIndex() ) );
		return seleccionPais;
	}
	public int getIdContinente(){
		//int c=cbxContinente.getSelectedIndex();
		//String a=cbxContinente.getValue(cbxContinente.getSelectedIndex() );
		//return Integer.parseInt( cbxContinente.getValue(cbxContinente.getSelectedIndex() ));
		
		return seleccionContinente;
	}
	public int getIdCiudad(){
		//return Integer.parseInt( cbxCiudad.getValue( cbxCiudad.getSelectedIndex() ) );
		return seleccionCiudad;
	}
	private void llenarComboPaises(String idContinente) {
		if (destinoPaquete != null){
			destinoPaquete.ocultarInfoAlmacen();
		}
		if (Integer.parseInt(idContinente)==0){
			cbxPais.clear();
			cbxCiudad.clear();
			cbxPais.addItem("Seleccione",null,0+"");
			cbxCiudad.addItem("Seleccione",null,0+"");
			return;
		}
		IServiciosGeograficosAsync serviciosGeograficos = GWT.create(IServiciosGeograficos.class);
		serviciosGeograficos.listPaises(idAlmacen, idContinente,new AsyncCallback<List<PaisDTO>>(){
			@Override
			public void onSuccess(List<PaisDTO> result) {
				cbxPais.clear();
				cbxPais.addItem("Seleccione",null,0+"");
				for(PaisDTO p: result){
					cbxPais.addItem(p.getNombre(),null,p.getId()+"");
				}
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}
	
	
	private void llenarComboCiudades(String idPais) {
		
		if (destinoPaquete != null){
			destinoPaquete.ocultarInfoAlmacen();
		}
		
		if (Integer.parseInt(idPais)==0){
			cbxCiudad.clear();
			cbxCiudad.addItem("Seleccione",null,0+"");
			return;
		}
		IServiciosGeograficosAsync serviciosGeograficos = GWT.create(IServiciosGeograficos.class);
		serviciosGeograficos.listCiudades(idAlmacen, idPais, new AsyncCallback<List<CiudadDTO>> (){
			@Override
			public void onSuccess(List<CiudadDTO> result) {
				cbxCiudad.clear();
				cbxCiudad.addItem("Seleccione",null,0+"");
				for(CiudadDTO c: result){
					cbxCiudad.addItem(c.getNombre(),null,c.getId()+"");
				}
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}
	public void setIdAlmacen(int idAlmacen){
		this.idAlmacen = idAlmacen;
		llenarComboContinente();
	}
	public void setStage(DestinoPaquete destinoPaquete) {
		this.destinoPaquete=destinoPaquete;
	}
}
